/*
 * @description: 首先要搞明白参数 {key1: key1Reducer,key2: key2Reducer}，对象里面每一个key对应的一个 Reducer
 *   接着是需要返回的内容是一个 大Reducer，对应格式应该是 最原始的Reducer
 * 
 * 需要记住 返回的 Reducer 函数的内容是 根据 action 操作state，最终返回state
 */
export default function combineReducers(reducers) {
  // 返回的函数主要合并 Action，combineAction有是一个大的 Reducer，reducer的返回值是state
  return function combineAction(state = {}, action) {

    // 因为我们不知道传入的 action是具体要操作哪个key对应的 reducer的，所以就只能遍历一遍所有的 reducers，挨个传入 action
    let nextState = {};
    let hasChange = false;
    for (const key in reducers) {
      const reducer = reducers[key];
      nextState[key] = reducer(state[key], action); // 遍历调用，就是合并
      hasChange = hasChange || nextState[key] !== state[key];
    }

    hasChange = hasChange || Object.keys(nextState).length !== Object.keys(state).length;
    return hasChange ? nextState : state;
  };
}
